import { customRef, ref } from "vue"
import dayjs from "dayjs"

// data 为创建时的数据
// delay 为防抖时间
// 如果用户多次频繁操作以最后一次为准，进行数据更新或者网络资源请求，以消除冗余的操作，或者减少一定的请求资源浪费。
export function debounceRef(data, delay = 100) {
    // 创建定时器
    let timer = null
    // 对 delay 进行判断，如果传递的是 null 则不需要使用 防抖方案，直接返回使用 ref 创建的。
    return delay == null
        ? // 返回 ref 创建的
          ref(data)
        : // customRef 中会返回两个函数参数。一个是：track 在获取数据时收集依赖的；一个是：trigger 在修改数据时进行通知派发更新的。
          customRef((track, trigger) => {
              return {
                  get() {
                      // 收集依赖
                      track()
                      // 返回当前数据的值
                      return data
                  },
                  set(value) {
                      // 清除定时器
                      if (timer != null) {
                          clearTimeout(timer)
                          timer = null
                      }
                      // 创建定时器
                      timer = setTimeout(() => {
                          // 修改数据
                          data = value
                          // 派发更新
                          trigger()
                      }, delay)
                  },
              }
          })
}
export function debounce(fn, delay = 500) {
    let timer = null
    return function (...args) {
        if (timer) clearTimeout(timer)
        timer = setTimeout(() => {
            fn.apply(this, args)
        }, delay)
    }
}

// data 为创建时的数据
// delay 为节流时间
// 在一定时间范围内，用户触发多次只会执行一次以达到防止用户频繁操作的目的。
export function throttleRef(data, delay = 100) {
    // 创建定时器
    let timer = null
    // 对 delay 进行判断，如果传递的是 null 则不需要使用 节流方案，直接返回使用 ref 创建的。
    return delay == null
        ? // 返回 ref 创建的
          ref(data)
        : // customRef 中会返回两个函数参数。一个是：track 在获取数据时收集依赖的；一个是：trigger 在修改数据时进行通知派发更新的。
          customRef((track, trigger) => {
              return {
                  get() {
                      // 收集依赖
                      track()
                      // 返回当前数据的值
                      return data
                  },
                  set(value) {
                      // 判断
                      if (timer == null) {
                          // 创建定时器
                          timer = setTimeout(() => {
                              // 修改数据
                              data = value
                              // 派发更新
                              trigger()
                              // 清除定时器
                              clearTimeout(timer)
                              timer = null
                          }, delay)
                      }
                  },
              }
          })
}

export function formatCommentDate(date) {
    let now = dayjs()
    // console.log(dayjs(date).isValid(), date);
    if (!dayjs(date).isValid()) {
        return date
    }
    let date_tmp = dayjs(date)
    if (now.startOf("day").subtract(5, "day").isAfter(date)) {
        return `${date_tmp.format("YYYY-MM-DD HH:mm")}`
    } else if (now.startOf("day").subtract(4, "day").isAfter(date)) {
        return "5天前"
    } else if (now.startOf("day").subtract(3, "day").isAfter(date)) {
        return "4天前"
    } else if (now.startOf("day").subtract(2, "day").isAfter(date)) {
        return "3天前"
    } else if (now.startOf("day").subtract(1, "day").isAfter(date)) {
        return "2天前"
    } else if (now.startOf("day").isAfter(date)) {
        return `昨天 ${date_tmp.format("HH:mm")}`
    } else {
        // if (now.subtract(1, 'hour').isAfter(date)) {
        return `今天 ${date_tmp.format("HH:mm")}`
        // } else if (now.subtract(1, 'minute').isAfter(date)) {
        //   return `${now.diff(date_tmp, 'minute')} 分钟前`;
        // } else {
        //   return `${now.diff(date_tmp, 'second')} 秒前`;
        // }
    }
}

export function getUUID() {
    let v = "xxxxxxxx-xxxx-4xxx-yxxx-".replace(/[xy]/g, function (c) {
        var r = (Math.random() * 16) | 0,
            v = c == "x" ? r : (r & 0x3) | 0x8
        return v.toString(16)
    })
    let da = new Date().getTime() % 1000000000000
    return v + da
}
